﻿//
// Source: Rob Conery - http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/
// MvcPager：mike108mvp  -  http://mike108mvp.cnblogs.com
//

using System.Collections.Generic;
using System.Linq;
using System;

namespace Longtop.Web.Helpers {
    public interface IPagedList {
        int TotalPage //总页数
        {
            get;
        }

        int TotalCount {
            get;
            set;
        }

        int PageIndex {
            get;
            set;
        }

        int PageSize {
            get;
            set;
        }

        bool IsPreviousPage {
            get;
        }

        bool IsNextPage {
            get;
        }
    }

    public class PagedList<T> : List<T>, IPagedList {
        public PagedList(IQueryable<T> source, int index, int pageSize) {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip((index - 1) * pageSize).Take(pageSize).ToList());
        }


        public PagedList(List<T> source, int index, int pageSize) {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source);
        }


        public PagedList(T[] source, int index, int pageSize) {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip((index - 1) * pageSize).Take(pageSize).ToList());
        }


        public int TotalPage {
            get { return (int)System.Math.Ceiling((double)TotalCount / PageSize); }
        }

        public int TotalCount {
            get;
            set;
        }

        public int PageIndex {
            get;
            set;
        }

        public int PageSize {
            get;
            set;
        }

        public bool IsPreviousPage {
            get {
                return (PageIndex > 1);
            }
        }

        public bool IsNextPage {
            get {
                return ((PageIndex) * PageSize) < TotalCount;
            }
        }
    }


    public static class Pagination {
        public static PagedList<T> ToPagedList<T>(this IOrderedQueryable<T> source, int index, int pageSize) {
            return new PagedList<T>(source, index, pageSize);
        }
        public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index, int pageSize) {
            return new PagedList<T>(source, index, pageSize);
        }
        public static PagedList<T> ToPagedList<T>(this T[] source, int index, int pageSize) {
            return new PagedList<T>(source, index, pageSize);
        }
        public static PagedList<T> ToPagedList<T>(this IOrderedQueryable<T> source, int index) {
            return new PagedList<T>(source, index, 10);
        }

        public static PagedList<T> ToPagedList<T>(this List<T> source, int index, int pageSize) {
            return new PagedList<T>(source, index, pageSize);
        }

        public static PagedList<T> ToPagedList<T>(this List<T> source, int index) {
            return new PagedList<T>(source, index, 10);
        }
    }
}